PRO1036 - Analyse de données scientifiques en R
October 6, 2025
Un sondage a demandé à des gens leur nom et le nombre de chat qu’ils possèdent. Les instructions indiquaient d’entrer le nombre de chats en chiffres.
# A tibble: 60 × 3
name number_of_cats handedness
<chr> <chr> <chr>
1 Bernice Warren 0 left
2 Woodrow Stone 0 left
3 Willie Bass 1 left
4 Tyrone Estrada 3 left
5 Alex Daniels 3 left
6 Jane Bates 2 left
7 Latoya Simpson 1 left
8 Darin Woods 1 left
9 Agnes Cobb 0 left
10 Tabitha Grant 0 left
# ℹ 50 more rows
Ca ne marche pas…
# A tibble: 1 × 1
mean_cats
<dbl>
1 NA
Toujours pas…
cat_lovers %>%
mutate(
number_of_cats = as.numeric(number_of_cats)
) %>%
summarise(mean_cats = mean(number_of_cats, na.rm = TRUE))# A tibble: 1 × 1
mean_cats
<dbl>
1 0.776
Ok mais …
Warning: There was 1 warning in `mutate()`.
ℹ In argument: `number_of_cats = as.numeric(number_of_cats)`.
Caused by warning:
! NAs introduits lors de la conversion automatique
logical - Valeurs booléennes TRUE et FALSE
character - Texte
double - Nombres à virgule flottante (type par défaut pour les nombres)
integer - Nombres entiers (indiqué par un L)
Des vecteurs peuvent être construits à l’aide de la fonction c()
… intentionnelle
… accidentelle
R va faire les conversions sans se poser de questions, surtout quand on mets différentes choses dans un même vecteur.
NANALes NA sont utilisés par R pour représenter des valeurs manquantes. Ils sont de type logique.
Nous avons parlé des types des données et nous allons maintenant parler des classes des données:
Par exemples:
factorLes facteurs sont utilisés pour gérer les variables catégorielles, c’est-à-dire les variables qui ont un ensemble fixe et connu de valeurs possibles.
factorPour chaque facteur on a:
Les dates sont en réalité un entier (le nombre de jours depuis l’origine, 1 Jan 1970) et un entier (l’origine) collés ensemble
Les data frames sont des structures de données qui sont comme des vecteurs de différentes classes.
Les listes sont des conteneurs génériques pour des vecteurs de n’importe quel type.
tibble est un data frame du TidyverseLes Tibbles sont des data frames modernes. Ils sont adaptés au tidyverse (en pratique, toutes les fonctions du tidyverse retournent des tibbles au lieu de data.frame).

df[["x"]]) en plus du $ (df$x). Il est ainsi possible d’utiliser le numéro de colonne au lieu du nom (df[[1]])Nous commençons avec un data frame avec des caractères
Au moment de faire un graphique, R va faire une conversion de type
Si on lui demande de plotter des catégories, il va créer des facteurs
Les facteurs sont ordonnées par ordre alphabétique par défaut
forcatsBasé sur des fonctions qui correspondent à des verbes permettant de manipuler des dataframes.

forcatsfocats possède plusieurs fonctions pour manipuler les facteurs:
fct_infreq()Utile quand on a beaucoup de niveaux
# A tibble: 31 × 2
skin_color n
<chr> <int>
1 fair 17
2 light 11
3 dark 6
4 green 6
5 grey 6
6 pale 5
7 brown 4
8 blue 2
9 blue, grey 2
10 none 2
# ℹ 21 more rows
… 31 niveaux dans cet exemple !
fct_lump()Regardons maintenant la masse moyenne selon la couleur des yeux:
Nous allons maintenant regrouper les couleurs des yeux et les ordonner selon la masse moyenne
fct_relevel()La variable month.name est une variable intégrée dans R qui contient les noms des mois en anglais et dans le bon ordre.
hotels <- readr::read_csv("data/hotels.csv")
hotels %>%
mutate(arrival_date_month = fct_relevel(arrival_date_month, month.name)) %>% # On réordonne les mois
group_by(hotel, arrival_date_month) %>% # group by type d'hotel et mois d'arrivée
summarise(mean_adr = mean(adr)) %>% # calcul de l'ADR moyen pour chaque groupe
ggplot(aes(
x = arrival_date_month,
y = mean_adr, # mean_adr sur y-axis
group = hotel, # Groupe les lignes par type
color = hotel) # couleur par type
) +
geom_line() + # On veut des lignes
scale_y_continuous(labels = label_dollar()) +
theme_minimal() + # Utilise le minimal theme
labs(x = "Arrival month", # On met à jour les labels
y = "Mean ADR (average daily rate)",
title = "Comparison of resort and city hotel prices across months",
subtitle = "Resort hotel prices soar in the summer while city hotel prices remain\nrelatively constant throughout the year",
color = "Hotel type") +
scale_x_discrete(guide = guide_axis(check.overlap = TRUE)) # On s'assure que les labels ne se chevauchent pasfct_recode()Si on veut simplement renommer les niveaux, on peut utiliser fct_recode()

lubridate est un package tidyverse-friendly qui facilite la manipulation des dates
Il ne fait pas partie du coeur tidyverse, donc il doit être installé avec install.packages("lubridate") mais il n’est pas chargé avec lui, et doit être explicitement chargé avec library(lubridate).
Calculer et visualiser le nombre de réservations à une date d’arrivée donnée
Nous allons voir les bases mais travailler avec des dates peut s’avérer complexe mais cela peut apporter beaucoup à une analyse.
library(glue) # glue permet de coller des éléments ensemble
hotels %>%
mutate(
arrival_date = glue("{arrival_date_year} {arrival_date_month} {arrival_date_day_of_month}")
) %>%
relocate(arrival_date) # pour afficher la nouvelle colonne à gauche# A tibble: 119,390 × 33
arrival_date hotel is_canceled lead_time arrival_date_year arrival_date_month
<glue> <chr> <dbl> <dbl> <dbl> <chr>
1 2015 July 1 Reso… 0 342 2015 July
2 2015 July 1 Reso… 0 737 2015 July
3 2015 July 1 Reso… 0 7 2015 July
4 2015 July 1 Reso… 0 13 2015 July
5 2015 July 1 Reso… 0 14 2015 July
6 2015 July 1 Reso… 0 14 2015 July
7 2015 July 1 Reso… 0 0 2015 July
8 2015 July 1 Reso… 0 9 2015 July
9 2015 July 1 Reso… 1 85 2015 July
10 2015 July 1 Reso… 1 75 2015 July
# ℹ 119,380 more rows
# ℹ 27 more variables: arrival_date_week_number <dbl>,
# arrival_date_day_of_month <dbl>, stays_in_weekend_nights <dbl>,
# stays_in_week_nights <dbl>, adults <dbl>, children <dbl>, babies <dbl>,
# meal <chr>, country <chr>, market_segment <chr>,
# distribution_channel <chr>, is_repeated_guest <dbl>,
# previous_cancellations <dbl>, previous_bookings_not_canceled <dbl>, …
hotels %>%
mutate(arrival_date = glue("{arrival_date_year} {arrival_date_month} {arrival_date_day_of_month}")) %>%
count(arrival_date)# A tibble: 793 × 2
arrival_date n
<glue> <int>
1 2015 August 1 110
2 2015 August 10 207
3 2015 August 11 117
4 2015 August 12 133
5 2015 August 13 107
6 2015 August 14 329
7 2015 August 15 190
8 2015 August 16 98
9 2015 August 17 188
10 2015 August 18 94
# ℹ 783 more rows
Quel est le problème ici ?
library(lubridate) # pour les dates
hotels %>%
mutate(
arrival_date = ymd(glue("{arrival_date_year} {arrival_date_month} {arrival_date_day_of_month}"))
) %>%
relocate(arrival_date)# A tibble: 119,390 × 33
arrival_date hotel is_canceled lead_time arrival_date_year arrival_date_month
<date> <chr> <dbl> <dbl> <dbl> <chr>
1 2015-07-01 Reso… 0 342 2015 July
2 2015-07-01 Reso… 0 737 2015 July
3 2015-07-01 Reso… 0 7 2015 July
4 2015-07-01 Reso… 0 13 2015 July
5 2015-07-01 Reso… 0 14 2015 July
6 2015-07-01 Reso… 0 14 2015 July
7 2015-07-01 Reso… 0 0 2015 July
8 2015-07-01 Reso… 0 9 2015 July
9 2015-07-01 Reso… 1 85 2015 July
10 2015-07-01 Reso… 1 75 2015 July
# ℹ 119,380 more rows
# ℹ 27 more variables: arrival_date_week_number <dbl>,
# arrival_date_day_of_month <dbl>, stays_in_weekend_nights <dbl>,
# stays_in_week_nights <dbl>, adults <dbl>, children <dbl>, babies <dbl>,
# meal <chr>, country <chr>, market_segment <chr>,
# distribution_channel <chr>, is_repeated_guest <dbl>,
# previous_cancellations <dbl>, previous_bookings_not_canceled <dbl>, …
hotels %>%
mutate(arrival_date = ymd(glue("{arrival_date_year} {arrival_date_month} {arrival_date_day_of_month}"))) %>%
count(arrival_date)# A tibble: 793 × 2
arrival_date n
<date> <int>
1 2015-07-01 122
2 2015-07-02 93
3 2015-07-03 56
4 2015-07-04 88
5 2015-07-05 53
6 2015-07-06 75
7 2015-07-07 54
8 2015-07-08 69
9 2015-07-09 80
10 2015-07-10 51
# ℹ 783 more rows
hotels %>%
mutate(arrival_date = ymd(glue("{arrival_date_year} {arrival_date_month} {arrival_date_day_of_month}"))) %>%
count(arrival_date) %>%
ggplot(aes(x = arrival_date, y = n, group = 1)) +
geom_smooth() #<<

PRO1036 - 04 | Tim Bollé